memory allocation Reserving memory for specific purposes. Operating systems and applications generally reserve fixed amounts of memory at startup and allocate more when additional functions must be executed. If there is not enough free memory to load the core kernel of an application, it cannot be launched. Although a virtual memory function will simulate an almost unlimited amount of memory, there is always a certain amount of "real" memory that is needed. When an application is programmed, the programmer must typically allocate additional memory as needed and release that memory when that function is no longer used. This is tedious and error prone, as it is easy to forget to deallocate the memory, which then typically remains unused until the program is closed. Some operating systems perform "garbage collection," whereby they release memory automatically when the contents of memory has not been used for some period of time. One of the advantages of the Java environment is that memory allocation and deallocation is handled automatically by the Java Virtual Machine. Memory is also allocated for a disk cache by the operating system and may be configurable by the user. A disk cache retains large chunks of data from the disk in faster RAM. However, a large disk cache that speeds up one application may slow down another because there is less normal memory available. On PCs before DOS 6, users were expected to allocate the right mix of expanded memory (EMS) and extended memory, causing third-party memory managers such as QEMM and 386MAX to become popular because they did it automatically. DOS 6 provided automatic allocation, and Windows 95 included even more dynamic memory allocations. Users should never have had to make such technical decisions in the first place. That is what a computer is supposed to do.